#include <iostream>
#include <signal.h>
#include <unistd.h>

using namespace std;

void Print(sigset_t &pending)
{
    for(int signo = 31;signo>=1;signo--)
    {
        if(sigismember(&pending,signo))     cout<<"1";
        else cout<<"0";
    }
    cout<<"\n";
}

void handler(int signo)
{
    cout << "signal : " << signo << endl;
    //不断获取当前进程的pending信号集并打印
    sigset_t pending;
    sigemptyset(&pending);
    while(true)
    {
        sigpending(&pending);
        Print(pending);
    }
}

int main()
{
    struct sigaction act, oact;
    act.sa_handler = handler;
    act.sa_flags = 0;
    sigemptyset(&act.sa_mask);
    sigaddset(&act.sa_mask,3);//将3、4号信号设置为，收到2号信号时添加屏蔽
    sigaddset(&act.sa_mask,4);

    sigaction(2, &act, &oact); // 捕捉2号信号
    while(true) sleep(1);

    return 0;
}